package DataStructureAndAlgorithm.Tedukuri.递推与递归;
//递归实现组合型枚举
import java.util.Scanner;
public class AcWing_93 {
    static int n,m;
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        dfs(0,0,0);
    }
    static void dfs(int u,int state,int cnt){
        //如果当前选的个数加上后面所有没选的个数，都小于m，则一定不合法，直接剪枝
        if (cnt + n - u < m)return;
        //如果已经选了cnt个
        if (cnt == m){
            for (int i = 0; i < n; i++){
                //判断第i位是否选择
                if ((state >> i & 1) == 1){
                    System.out.print((i + 1) + " ");
                }
            }
            System.out.println();
            return ;
        }
        //因为要从小到大排序，所以要优先进入选第i个数的情况
        //选第i个数
        dfs(u + 1, state + (1 << u), cnt + 1);
        //不选第i个数
        dfs(u + 1, state, cnt);
    }
}
/*

从 1∼n
这 n 个整数中随机选出 m

个，输出所有可能的选择方案。
输入格式

两个整数 n,m

,在同一行用空格隔开。
输出格式

按照从小到大的顺序输出所有方案，每行 1

个。

首先，同一行内的数升序排列，相邻两个数用一个空格隔开。

其次，对于两个不同的行，对应下标的数一一比较，字典序较小的排在前面（例如 1 3 5 7 排在 1 3 6 8 前面）。
 */